[アップデート]Global AcceleratorがCloudFormationをサポートするようになりました
はじめに
こんにちは。大阪オフィスの林です。
2020年5月14日(木)の公式アナウンスにて、「AWS Global AcceleratorがAWS CloudFormationをサポートするようになりました」と発表がありました。公式ページはこちら
ちょうどAWS Global Acceleratorを触ってたのと、久しぶりにCloudFormationを触ってみたかったので試してみました!
AWS Global Acceleratorの機能だったりは下記の記事をご参照頂ければと思います。
今回やること
- ALBに紐づけるAWS Global AcceleratorをCloudFormationで作成する。
- ALB及びTargetgroupも、同じCloudFormationテンプレートの中で作成する。
- Targetgroupに紐づけるEC2は予め作成済みのリソースをCloudFormation実行時のパラメータで指定する。
リファレンスの紹介
CloudFormationでAWS Global Acceleratorを扱う際、大きく3つのリソースを定義してあげる必要があります。
- 1つ目 AWS :: GlobalAccelerator :: Accelerator
AWS Global Acceleratorの本体(?)というか、大枠を作成するリソースを定義します。
今回はスタック名をそのままAWS Global Acceleratorの名前にします。Enabled
のパラメータはデフォルトでtrue
ですが今回は明示的に指定しておきます。
MyAccelerator: Type: AWS::GlobalAccelerator::Accelerator Properties: Name: !Sub '${AWS::StackName}' Enabled: true IpAddressType: IPV4
- 2つ目 AWS :: GlobalAccelerator :: Listener
AWS Global Acceleratorに紐づけるリスナーを定義します。コードの中ではAcceleratorArn
で上記「1つ目」で指定したリソースのARNを参照させることで紐付けを行っています。
MyListener: Type: AWS::GlobalAccelerator::Listener Properties: AcceleratorArn: !Ref MyAccelerator Protocol: TCP PortRanges: - FromPort: 80 ToPort: 80 ClientAffinity: SOURCE_IP
- 3つ目 AWS :: GlobalAccelerator :: EndpointGroup
リスナーに紐づけるエンドポイントを定義します。EndpointId
で紐付けるエンドポイントのARNを参照して紐付けを行っています。。今回はALBをエンドポイントとして紐づけるので、ALBのARNを参照させています。※CloudFormationテンプレートの全体は本記事の最後に載せていますので全体はそちらからご確認頂ければと思います。
MyEndpointGroup: Type: AWS::GlobalAccelerator::EndpointGroup Properties: ListenerArn: !Ref MyListener #TrafficDialPercentage: !Ref TrafficPercentage EndpointGroupRegion: !Ref AWS::Region EndpointConfigurations: - EndpointId: !Ref MyLoadBalancer Weight: 100
上記コードの中で使ってるPropertiesや、使っていないPropertiesの一覧や説明は下記を参照ください。
AWS::GlobalAccelerator::Accelerator
AWS::GlobalAccelerator::Listener
AWS :: GlobalAccelerator :: EndpointGroup
実行してみた
CloudFormation実行時に予め準備していたEC2を指定します。今回はTargetgroupに2台のEC2を割り当てるため、2つのインスタンスを指定出来るようにしています。
CloudFormationでのデプロイが完了後、Global Acceleratorのダッシュボードを見に行くと、定義したGlobal Accelerator作成されていることが確認できます。
ロードバランサーとの紐付きも確認します。ロードバランサーのダッシュボードから「統合サービス」タブを確認すると、作成したGlobal Acceleratorに関連付けられていることが確認できます。
動作確認で、Global AcceleratorのDNS名にブラウザからアクセスすると、EC2で準備しておいたテストページが表示されました。これで、Global Accelerator
→ ALB
→ EC2
という経路で接続出来たことが確認できます。
まとめ
CloudFormationを使って、AWS Global Acceleratorを簡単にデプロイする方法をご紹介させて頂きました!AWS Global Acceleratorに限らず、CloudFormationを触ってると「このサービス、こんなパラメータも指定できるのかぁ~」といった発見もあったりで非常に面白いです!ぜひ皆さんもお試しください!
以上、大阪オフィスの林がお送りしました!
参考
あわせて読みたい
Cloudformationテンプレート
AWSTemplateFormatVersion: '2010-09-09' Description: "GlobalAccelerator Create by Classmethod" Resources: # ------------------------------------------------------------# # Input Parameters # ------------------------------------------------------------# Metadata: AWS::CloudFormation::Interface: ParameterGroups: - Parameters: - Target1 - Target2 Parameters: Target1: Description: Please Select EC2 Target. Type: AWS::EC2::Instance::Id Target2: Description: Please Select EC2 Target. Type: AWS::EC2::Instance::Id Resources: # ------------------------------------------------------------# # GlobalAccelerator # ------------------------------------------------------------# Accelerator: Type: AWS::GlobalAccelerator::Accelerator Properties: Name: !Sub '${AWS::StackName}' Enabled: true IpAddressType: IPV4 MyListener: Type: AWS::GlobalAccelerator::Listener Properties: AcceleratorArn: !Ref Accelerator Protocol: TCP PortRanges: - FromPort: 80 ToPort: 80 ClientAffinity: SOURCE_IP MyEndpointGroup: Type: AWS::GlobalAccelerator::EndpointGroup Properties: ListenerArn: !Ref MyListener #TrafficDialPercentage: !Ref TrafficPercentage EndpointGroupRegion: !Ref AWS::Region EndpointConfigurations: - EndpointId: !Ref LoadBalancer Weight: 100 # ------------------------------------------------------------# # ALB # ------------------------------------------------------------# MyLoadBalancer: Type: AWS::ElasticLoadBalancingV2::LoadBalancer Properties: Scheme: internal Subnets: - "subnet-xxxxxxxxxxxxxxxxx" - "subnet-xxxxxxxxxxxxxxxxx" SecurityGroups: - "sg-xxxxxxxxxxxxxxxxx" # ------------------------------------------------------------# # TargetGroup # ------------------------------------------------------------# MyTargetGroup: Type: AWS::ElasticLoadBalancingV2::TargetGroup Properties: Name: test-tg Port: 80 Protocol: HTTP TargetType: instance Targets: - Id: !Sub ${Target1} - Id: !Sub ${Target2} Tags: - Key: Name Value: test-tg VpcId: "vpc-xxxxxxxxxxxxxxxxx" # ------------------------------------------------------------# # Listener # ------------------------------------------------------------# MyLBListener: Type: "AWS::ElasticLoadBalancingV2::Listener" Properties: DefaultActions: - TargetGroupArn: !Ref MyTargetGroup Type: forward LoadBalancerArn: !Ref MyLoadBalancer Port: 80 Protocol: HTTP